package com.steamedfish.auctioncloudgatewayserver.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TokenUtils {

    //私钥
    private static final String SECRET = "shanfushanfu";

    private static Logger logger = LoggerFactory.getLogger(TokenUtils.class);

    //过期时间1分钟
    private static final int EXPIRES_TIME = 60000;


    //生成令牌的方法
    public static String createToken(Long userId){
        //获取加上过期时间后的时间
        Date nowDate = new Date();

        //创建过期时间
        Date expiresDate = new Date(System.currentTimeMillis()+EXPIRES_TIME);

        //定义token头部
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");


        String token = JWT.create()
                //定义请求头
                .withHeader(map)
                //定义签发方
                .withClaim("iss", "Service")
                //定义接收方
                .withClaim("aud", "Client")
                //存储用户信息
                .withClaim("principal", null==userId?null:userId.longValue())
                //设置tokens生成时间
                .withIssuedAt(nowDate)
                //设置token过期时间
                .withExpiresAt(expiresDate)
                //设置私钥
                .sign(Algorithm.HMAC256(SECRET));
        return token;
    }


    //解析令牌的方法
    public static boolean verifyToken(String token){
        try{
            //生成token令牌检验器
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            //使用检验器进行检验
            verifier.verify(token);
            //返回校验结果
            return true;
        }catch(Exception e){
            logger.info("token不合法");
            return false;
        }
    }

    public static DecodedJWT verifyTokenGetClaims(String token){
        try{
            //生成token令牌检验器
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            //使用检验器进行检验
            DecodedJWT jwt = verifier.verify(token);
            return jwt;
        }catch(Exception e){
            logger.info("token不合法");
            return null;
        }
    }

}